package com.bstech.Tabelle;

import java.io.Serializable;
import java.util.List;
import java.util.Vector;

import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

import com.bstech.Classi.Common;
import com.bstech.Utils.*;
import com.bstech.assistance.R;

public class Destinazioni {
	public static String TABLE_NAME = "DESTINAZIONI";
	
	public static String ID_KEY = "ID";
	public static String ID_CLIENTE_KEY = "ID_CLIENTE";
	public static String CODICE_KEY = "CODICE";
	public static String DESCRIZIONE_KEY = "DESCRIZIONE";
	public static String INDIRIZZO_KEY = "INDIRIZZO";
	public static String CITTA_KEY = "CITTA";
	public static String TELEFONO_KEY = "TELEFONO";
	public static String NOTE_KEY = "NOTE";
	public static String PROGETTO_KEY = "PROGETTO"; //codice di progetto per le chiamate straordinarie
	
	public static String CREATE_TABLE_QUERY = "CREATE TABLE IF NOT EXISTS "+ TABLE_NAME +"(" +
												ID_KEY +" integer primary key not null," +
												ID_CLIENTE_KEY+" integer not null," +
												CODICE_KEY+"  text not null," +
												DESCRIZIONE_KEY+" text null," +
												INDIRIZZO_KEY+"  text null," +
												CITTA_KEY+" text null," +
												TELEFONO_KEY+" text null," +
												NOTE_KEY+" text null," +
												PROGETTO_KEY+" text null);";
	
	public static void UpdateToVersion(SQLiteDatabase db, int from, int to )
	{
//		for(int ver = from +1; ver<= to; ver++)
//		{
//			switch(ver)
//			{
//			case 3:
//				db.execSQL("");
//				break;
//			}
//		}
	}
	public static boolean Insert(int ID, int IdCliente,String Codice, String Descrizione, String Indirizzo, String Citta, String Telefono, String Note, String Progetto)
	{
		ContentValues cv = new ContentValues();
		
		cv.put(Destinazioni.ID_KEY, ID);
		cv.put(Destinazioni.ID_CLIENTE_KEY, IdCliente);
		cv.put(Destinazioni.CODICE_KEY, Strings.CheckString(Codice));
		cv.put(Destinazioni.DESCRIZIONE_KEY, Strings.CheckString(Descrizione));
		cv.put(Destinazioni.INDIRIZZO_KEY, Strings.CheckString(Indirizzo));
		cv.put(Destinazioni.CITTA_KEY, Strings.CheckString(Citta));
		cv.put(Destinazioni.TELEFONO_KEY, Strings.CheckString(Telefono));
		cv.put(Destinazioni.NOTE_KEY, Strings.CheckString(Note));
		cv.put(Destinazioni.PROGETTO_KEY, Strings.CheckString(Progetto));
		
		return Common.db.Insert(Destinazioni.TABLE_NAME, null, cv);
	}
	public static boolean Update(int ID, int IdCliente,String Codice, String Descrizione, String Indirizzo, String Citta, String Telefono, String Note, String Progetto)
	{
		ContentValues cv = new ContentValues();
		
		cv.put(Destinazioni.ID_CLIENTE_KEY, IdCliente);
		cv.put(Destinazioni.CODICE_KEY, Strings.CheckString(Codice));
		cv.put(Destinazioni.DESCRIZIONE_KEY, Strings.CheckString(Descrizione));
		cv.put(Destinazioni.INDIRIZZO_KEY, Strings.CheckString(Indirizzo));
		cv.put(Destinazioni.CITTA_KEY, Strings.CheckString(Citta));
		cv.put(Destinazioni.TELEFONO_KEY, Strings.CheckString(Telefono));
		cv.put(Destinazioni.NOTE_KEY, Strings.CheckString(Note));
		cv.put(Destinazioni.PROGETTO_KEY, Strings.CheckString(Progetto));
		
		return Common.db.Update(Destinazioni.TABLE_NAME, cv,Destinazioni.ID_KEY + " = " + Integer.toString(ID),null);
	}
	public static Destinazione Select(int ID)
	{
		Cursor cursor = Common.db.query(Destinazioni.TABLE_NAME, new String[] {Destinazioni.ID_KEY,Destinazioni.ID_CLIENTE_KEY,Destinazioni.CODICE_KEY,Destinazioni.DESCRIZIONE_KEY,Destinazioni.INDIRIZZO_KEY,Destinazioni.CITTA_KEY,Destinazioni.TELEFONO_KEY,Destinazioni.NOTE_KEY,Destinazioni.PROGETTO_KEY},
				Destinazioni.ID_KEY + "= " + Integer.toString(ID),
				null, null,null, null);

		if(cursor != null && cursor.moveToFirst())
		{
			Destinazione ret =  Select(cursor);
			cursor.close();
			return ret;
		}
		else
			return null;
	}
	public static List<Destinazione> SelectAll(int IdCliente)
	{
		Cursor cursor = Common.db.query(Destinazioni.TABLE_NAME, new String[] {Destinazioni.ID_KEY,Destinazioni.ID_CLIENTE_KEY,Destinazioni.CODICE_KEY,Destinazioni.DESCRIZIONE_KEY,Destinazioni.INDIRIZZO_KEY,Destinazioni.CITTA_KEY,Destinazioni.TELEFONO_KEY,Destinazioni.NOTE_KEY,Destinazioni.PROGETTO_KEY},
				Destinazioni.ID_CLIENTE_KEY + "=" + Integer.toString(IdCliente),
				null, null,null, 
				Destinazioni.DESCRIZIONE_KEY);
		
		List<Destinazione> ret = new Vector<Destinazione>();
		
		if(cursor != null)
		{
			while(cursor.moveToNext())
				ret.add(Select(cursor));
			cursor.close();
		}
		
		return ret;
	}
	private static Destinazione Select(Cursor cursor)
	{
		Destinazione ret = null;
		
		if(cursor != null && !cursor.isAfterLast())
		{	
			ret = new Destinazione();
			
			ret.ID = cursor.getInt(0);
			ret.IdCliente = cursor.getInt(1);
			ret.Codice = cursor.getString(2);
			ret.Descrizione = cursor.getString(3);
			ret.Indirizzo = cursor.getString(4);
			ret.Citta = cursor.getString(5);
			ret.Telefono = cursor.getString(6);
			ret.Note = cursor.getString(7);
			ret.Progetto = cursor.getString(8);
		}
		return ret;
	}
	public static boolean Exists(int idDestinazione) {
		Cursor cursor = Common.db.query(Destinazioni.TABLE_NAME,new String[] { Destinazioni.ID_KEY }, Destinazioni.ID_KEY + "=" + Integer.toString(idDestinazione), null, null, null, null);

		int count = 0;
		if (cursor != null) {
			count = cursor.getCount();
			cursor.close();
		}
		return (count > 0);
	}
	public static List<String> GetExtraordinaryJobs(int IdCliente)
	{
		Cursor cursor = Common.db.query(Destinazioni.TABLE_NAME, new String[] {Destinazioni.PROGETTO_KEY},
				Destinazioni.ID_CLIENTE_KEY + "=" + Integer.toString(IdCliente),
				null, null,null, 
				Destinazioni.PROGETTO_KEY);
		
		List<String> ret = new Vector<String>();
		
		if(cursor != null)
		{
			String prj = "";
			while(cursor.moveToNext())
			{
				prj = cursor.getString(0);
				if(!prj.equals("") && !ret.contains(prj))
					ret.add(prj);
			}
				
			cursor.close();
		}
		
		return ret;
	}
	public static class Destinazione implements Serializable
	{
		private static final long serialVersionUID = 145L;

		public Destinazione(){}
		public int ID,IdCliente;
		public String Codice,Descrizione,Indirizzo,Citta,Telefono,Note,Progetto;
		
		public static List<Destinazione> GetFromXml(String xml)
		{
			List<Destinazione> ret = new Vector<Destinazione>();
			
			if(xml !=null)
			{
				NodeList nodi = XmlParser.ParseNodes(xml, "DESTINAZIONE");
				if(nodi !=null)
				{
					int nodesCount = nodi.getLength();
					Destinazione t = null;
					
					for(int i=0; i < nodesCount; i++)
					{
						t = ParseFromXmlNode(nodi.item(i));
						if(t != null)
							ret.add(t);
					}
					
					t = null;
					nodi = null;
				}
				else
					Log.e("Destinazione.GetFromXml", "Errore durante il parse dei nodi, ritornato null");
			}
			else
				Log.e("Destinazione.GetFromXml", "Parametro xml nullo");
			
			return ret;
		}
		private static Destinazione ParseFromXmlNode(Node nodo) {
			Destinazione ret = new Destinazione();
			
			NodeList dettagli = nodo.getChildNodes();
			int detailsCount = dettagli.getLength();
			
			Element dettaglio = null;
			String nome = "";
			String valore = "";
			
			for(int i=0;i<detailsCount;i++)
			{
				try {
					if(dettagli.item(i).getNodeType() == Node.ELEMENT_NODE)
					{
						dettaglio = (Element)dettagli.item(i);
						nome = dettaglio.getNodeName();
						valore = dettaglio.getTextContent();
						
						if(nome.equals("ID"))
							ret.ID = Integer.parseInt(valore.trim());
						else if(nome.equals("CL02_CLIENTE_CL01"))
							ret.IdCliente = Integer.parseInt(valore.trim());
						else if(nome.equals("CL02_CODICE"))
							ret.Codice = valore.trim();
						else if(nome.equals("CL02_DESCRIZIONE"))
							ret.Descrizione = valore.trim();
						else if(nome.equals("CL02_INDIRIZZO"))
							ret.Indirizzo = valore.trim();
						else if(nome.equals("CL02_CITTA"))
							ret.Citta = valore.trim();
						else if(nome.equals("CL02_NOTE"))
							ret.Note = valore.trim();
						else if(nome.equals("CL02_PROGETTO"))
							ret.Progetto = valore.trim();
						
					}
				} catch (Exception e) {
					Log.e("Destianzione.ParseFromXmlNode", "Errore nel ciclo di assegnazione valori. Errore: " + e.toString());
					ret = null;
					break;
				}
			}
			
			dettaglio = null;
			dettagli = null;
			
			return ret;
		}
	}
	
	public static class DestinazioniAdapter extends  ArrayAdapter<Destinazione>
	{
		Context context;
		List<Destinazione> dataSource;
		
		public DestinazioniAdapter(Context context, List<Destinazione> source) 
		{
			super(context, R.layout.combobox_item_selection, source);
			this.context = context;
			this.dataSource = source;
		}
		
		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			return ReturnViewItem( position, convertView, parent,false);
		}
		
		@Override
		public Destinazione getItem(int position){
	       return dataSource.get(position);
		}
		
		@Override
	    public long getItemId(int position){
	       return position;
	    }
	
	    @Override
	    public View getDropDownView(int position, View convertView,ViewGroup parent) {
	    	return ReturnViewItem( position, convertView, parent,true);
	    }
	    
	    private View ReturnViewItem(int position, View convertView,ViewGroup parent, boolean isDropDown)
	    {
	    	View riga = convertView;
			ItemViewHolder holder;

			if (riga == null) {
				LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
				
				// creo un holder per gli oggetti in questa vista
				holder = new ItemViewHolder();
				
				riga = inflater.inflate(R.layout.combobox_item_selection, parent, false);
				holder.txtTesto = (TextView) riga.findViewById(R.id.combobox_item_selection_txtTesto);
				
				// e lo memorizzo nella vista
				riga.setTag(holder);
			} 
			else 
				holder = (ItemViewHolder) riga.getTag(); // mi ricarico l'holder degli oggetti

			Destinazione d = dataSource.get(position);
			
			holder.txtTesto.setText(d.Descrizione + " - " + d.Indirizzo + "," + d.Citta);
			
			d= null;
			
			return riga;
	    }

		private class ItemViewHolder {
			TextView txtTesto;
		}
		
		public int getItemPosition(int itemID)
		{
			if(this.dataSource == null || this.dataSource.size() == 0) return -1;
			
			int ret = -1;
			int size = this.dataSource.size();
			
			Destinazione d = null;
			for(int i=0; i < size; i++ )
			{
				d = this.dataSource.get(i);
				if(d.ID == itemID)
				{
					ret = i;
					break;
				}
			}
			
			d = null;
			return ret;
		}
	}
}
